/*
 * protocol_can.cpp

 *
 *  Created on: 2019-4-26
 *      Author: root
 */
#include "protocol_can.h"
#include "app_debug_can.h"
#include "Task_Timer.h"
#include "Tasks_can.h"
#include "tcu_can.h"
#include <stdio.h>
#include "protocol_offset.h"//摇信总故障

int protocol_can_init(void *pcan){
	Para_Can *para=(Para_Can *)pcan;
	printf("主控传到dllcan的 枪的个数=%d\n",para->gunnum);
	candll_debug("主控传到dllcan的设备号    devid=%.*a  枪的个数=%d ",8,para->devNo,para->gunnum);
	candll_debug("主控传来的 ctrlpw_type=%d\r\n",para->ctrlpw_type);
	initTask_Timer_can();
	initTasksCan(para);
	return 0;
}

int protocol_can_start_charge(u8 gunid,u8 ctrltype)
{
	int ret = 0;
	u8 tabid;
	u8 offset;
	u8 err_code = 0;
	tabid = 1;
	offset = 2;

	if (gpcan_para->type == DC) {
		err_code = (gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22[tabid]
				>> offset) & 0x01; //总g故
		if (err_code > 0)
			can_pro_debug("000充电桩出现故障  %.*a  %.*a",8,gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22,8,gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf23);
		else
			can_pro_debug("没有故障！！！%.*a  %.*a",8,gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22,8,gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf23);
	} else {
		err_code = (gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32[tabid]
				>> offset) & 0x01; //总g故
		if (err_code > 0)
			can_pro_debug("000充电桩出现故障  %.*a",8,gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32);
		else
			can_pro_debug("没有故障！！！%.*a ",8,gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32);
	}

	if (g_can[gunid].state == TCU_READY && err_code == 0) {
		can_pro_debug("收到充电要求，准备充电！！！ctrltype=%d", ctrltype);
		if (ctrltype == CTRL_PW_COMB) {
			if (gpcan_para->ctrlpw_type != CTRL_PW_COMB) {
				can_pro_debug("收到充电要求，准备充电！！！ctrltype=%d", ctrltype);
				if (ctrltype == CTRL_PW_COMB) {
					if (gpcan_para->ctrlpw_type != CTRL_PW_COMB) {
						can_pro_debug("收到共充充电要求，但充电桩不支持！gpcan_para->ctrlpw_type=%d",
								gpcan_para->ctrlpw_type);
						return 2;
					}
					can_pro_debug("收到共充充电要求！gpcan_para->ctrlpw_type=%d",
							gpcan_para->ctrlpw_type);
					g_can[gunid].state = TCU_CTRL_COMB;
					g_can[gunid].curpf = TCU_CMD_AND_CHARGE_SETING;
					g_can[gunid].ctrltype = TCU_CTRL_COMB;

				} else {
					can_pro_debug("收到充电要求，准备充电！！！gunid=%d", gunid); //收到来自控制器的遥信数据包
		      //      printf("\r\n\r\n第 %d号枪当前状态 state=%d  pf=%x\r\n\r\n",gunid,g_can[gunid].state,g_can[gunid].curpf);
		            g_can[gunid].state=TCU_START_CHARGING;
					start_charge(gunid,2);
					g_can[gunid].ms_cur_recv = 0;
				}

				can_pro_debug("收到共充充电要求，但充电桩不支持！gpcan_para->ctrlpw_type=%d",
						gpcan_para->ctrlpw_type);
				return 2;
			}
			can_pro_debug("收到共充充电要求！gpcan_para->ctrlpw_type=%d",
					gpcan_para->ctrlpw_type);
			g_can[gunid].state = TCU_CTRL_COMB;
			g_can[gunid].curpf = TCU_CMD_AND_CHARGE_SETING;
			g_can[gunid].ctrltype = TCU_CTRL_COMB;

		} else {
			can_pro_debug("收到充电要求，准备充电！！！gunid=%d\n", gunid); //收到来自控制器的遥信数据包
      //      printf("\r\n\r\n第 %d号枪当前状态 state=%d  pf=%x\r\n\r\n",gunid,g_can[gunid].state,g_can[gunid].curpf);
            g_can[gunid].state=TCU_START_CHARGING;
			start_charge(gunid, 2);
//			sprintf(_tmp_print_str,"can模块收到充电要求，准备充电！！！gunid=%d\n", gunid);
//			gpcan_para->writelog(_tmp_print_str);
			g_can[gunid].ms_cur_recv = 0;
		}


	} else {
		ret = 1;
		can_pro_debug("收到充电要求，但系统未准备好或者桩有故障！！！gunid=%d  g_can[gunid].state=%d,%d",
				gunid,g_can[gunid].state, err_code);
		sprintf(_tmp_print_str,"can模块收到充电要求，但系统未准备好或者桩有故障！！！gunid=%d  g_can[gunid].state=%d,%d\n",
				gunid,g_can[gunid].state, err_code);
		gpcan_para->writelog(_tmp_print_str);

	}
	return ret;

}

//主控调用充电停止：/远程停止 /刷卡停止 /条件满足停止 /电表故障停止 /can故障停止
int protocol_can_stop_charge( u8 gunid,char stop_reason) //返回0成功，1 失败  收到来自主控的can包 pmsg_rev100+
{
	u8 charge_state=0;
	charge_state=getChargeState(gunid);
	printf("收到充电停止要求，准备停止充电！！！g_can[gunid].state=%d  gpcan_para->data2main->errcode=%d  stop_reason=%d",g_can[gunid].state,gpcan_para->data2main->errcode[gunid],stop_reason);

//	sprintf(_tmp_print_str,"收到充电停止要求，准备停止充电！！！g_can[gunid].state=%d  gpcan_para->data2main->errcode=%d  stop_reason=%d",g_can[gunid].state,gpcan_para->data2main->errcode[gunid],stop_reason);
//
//	gpcan_para->writelog(_tmp_print_str);

	if (g_can[gunid].state == WAIT_CHARGEING1
			|| g_can[gunid].state == WAIT_CHARGEING2
			|| g_can[gunid].state == WAIT_CHARGEING3
			|| g_can[gunid].state == WAIT_CHARGE ) {


		if ( charge_state == 1) {
			g_can[gunid].state = TCU_STOP_CHARGING;
			stop_charge(gunid, MAIN_STOP_FIN);
			g_can[gunid].stop_reason = stop_reason;
			g_can[gunid].ms_cur_recv = 0;
		} else {
			finStopCharge_f(gunid, MAIN_STOP_FIN);
			g_can[gunid].ms_cur_recv = 0;
			g_can[gunid].state = TCU_READY;
			g_can[gunid].curpf=0;
		}

		// finStopCharge_f(gunid, MAIN_STOP_FIN);
		printf("已经充电情况下收到停止充电请求,发送停止完成命令\r\n");

	}
	else if (g_can[gunid].state ==TCU_START_CHARGING)
	{
		finStopCharge_f(gunid, MAIN_STOP_FIN);
		g_can[gunid].curpf=0;
		g_can[gunid].state=TCU_READY;
		g_can[gunid].ms_cur_recv = 0;
		printf("充电还未情况下收到停止充电请求,发送停止完成命令\r\n");
	}
	else// if(g_can[gunid].state ==TCU_IDEL || g_can[gunid].state ==HEART_BEAT_FIRST)
	{
		finStopCharge_f(gunid, MAIN_STOP_FIN);

	}
	return 0;
}
static int can_adjust_charge_pw(u8 gunid,u8 type,int value, int time)
{
	u8 tabid;
	u8 offset;
	u8 conn_state;
	if(gpcan_para->type==DC)
	{
		tabid=DC_IND_CONNECT_CAR_OFFSET/8+1;
		offset=DC_IND_CONNECT_CAR_OFFSET%8;
		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22[tabid]>>offset)&0x01;
	}
	else if(gpcan_para->type==AC)
	{
		tabid=AC_IND_CONNECT_SWITCH_OFFSET/8+1;
		offset=AC_IND_CONNECT_SWITCH_OFFSET%8;

		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32[tabid]>>offset)&0x01;
	}

	if(gpcan_para->data2main->errcode[gunid] >0){//心跳故障
		can_pro_debug1("功率调节失败:CAN通信故障! type=%d value=%d gunid=%d",type,value,gunid);
	return 1;
	}
	else if(conn_state == 1){//车辆未连接
		can_pro_debug1("功率调节失败:车辆未连接! type=%d value=%d gunid=%d",type,value,gunid);
	return 2;
	}
	else if(type!=1 && type!=2 && type!=3 && type!=4){//调节类型不支持
		can_pro_debug1("功率调节失败:调节类型不支持! type=%d value=%d  gunid=%d",type,value,gunid);
	return 4;
	}
	else if((type == 1 && (value>10000 || value<(-10000))) || (type == 2 &&
			(value>100 || value<0))){//调节值超出范围
		can_pro_debug1("功率调节失败:调节值超出范围! type=%d value=%d  gunid=%d",type,value,gunid);
			return 3;
	}
	else if((type==3 || type==4) && (g_can[gunid].state != WAIT_CHARGEING2)){
		can_pro_debug("功率调节失败:车辆未充电! type=%d value=%d   gunid=%d",type,value,gunid);
		return 2;
	}

	g_can[gunid].ctrltype=type;
	if(type==1 || type==2)
	{
		g_can[gunid].ctrlvalue = value;
		g_can[gunid].ctrtime=time;
	}
//	if(value>10000)
//		value=10000;
//	else if(value<-10000)
//		value=-10000;
//	g_can[gunid].ctrlvalue=value;
//	if(type == 1)
//		g_can[gunid].ctrlvalue += 10000;//偏移量
	else if(type == 3 || type == 4){
		g_can[gunid].ctrlvalue = 0;

	}

//	if(type == 3)
//		g_can[gunid].ctrtime = time;

	g_can[gunid].state_ctrl=CTRL_PW_EN;
	g_can[gunid].ms_fk_send=0;
	g_can[gunid].ms_fk_recv=0;

	adjust_pw(gunid);
	//	g_re_num_fk[gunid]=0;
	return 0;

}
//
//static int can_adjust_charge_pw(u8 gunid,u8 type,int value, int time)
//{
//	u8 tabid;
//	u8 offset;
//	u8 conn_state;
//
//	if(gpcan_para->type==DC)
//	{
//		tabid=DC_IND_CONNECT_CAR_OFFSET/8+1;
//		offset=DC_IND_CONNECT_CAR_OFFSET%8;
//		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22[tabid]>>offset)&0x01;
//	}
//	else if(gpcan_para->type==AC)
//	{
//		tabid=AC_IND_CONNECT_SWITCH_OFFSET/8+1;
//		offset=AC_IND_CONNECT_SWITCH_OFFSET%8;
//
//		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32[tabid]>>offset)&0x01;
//	}
//
//	if(gpcan_para->data2main->errcode[gunid] >0){//心跳故障
//		can_pro_debug1("功率调节失败:CAN通信故障! type=%d value=%d gunid=%d",type,value,gunid);
//	return 1;
//	}
//	else if(conn_state == 1){//车辆未连接
//		can_pro_debug("功率调节失败:车辆未连接! type=%d value=%d gunid=%d",type,value,gunid);
//	return 2;
//	}
//	else if(type!=1 && type!=2 && type!=3 && type!=4){//调节类型不支持
//		can_pro_debug("功率调节失败:调节类型不支持! type=%d value=%d  gunid=%d",type,value,gunid);
//	return 4;
//	}
//	else if((type == 1 && (value>10000 || value<(-10000))) || (type == 2 &&
//			(value>100 || value<0))){//调节值超出范围
//		can_pro_debug("功率调节失败:调节值超出范围! type=%d value=%d  gunid=%d",type,value,gunid);
//			return 3;
//	}
//	else if((type==3 || type==4) && (g_can[gunid].state != WAIT_CHARGEING2)){
//		can_pro_debug("功率调节失败:车辆未充电! type=%d value=%d   gunid=%d",type,value,gunid);
//		return 2;
//	}
//
//	g_can[gunid].ctrltype=type;
//	if(value>10000)
//		value=10000;
//	else if(value<-10000)
//		value=-10000;
//	g_can[gunid].ctrlvalue=value;
//	if(type == 1)
//		g_can[gunid].ctrlvalue += 10000;//偏移量
//	else if(type == 3 || type == 4){
//		g_can[gunid].ctrlvalue = 0;
//	}
//
//	if(type == 3)
//		g_can[gunid].ctrtime = time;
//
//	g_can[gunid].state_ctrl=CTRL_PW_EN;
//	g_can[gunid].ms_fk_send=0;
//	g_can[gunid].ms_fk_recv=0;
//	adjust_pw(gunid);
//	//	g_re_num_fk[gunid]=0;
//	return 0;
//
//}

//static int can_adjust_charge_pw(u8 gunid,u8 type,int value)
//{
//	u8 tabid;
//	u8 offset;
//	u8 conn_state;
//
//	                                                 	if(gpcan_para->type==DC)
//	                                                 	{
//	                                                 		tabid=DC_IND_CONNECT_CAR_OFFSET/8+1;
//	                                                 		offset=DC_IND_CONNECT_CAR_OFFSET%8;
//	                                                 		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22[tabid]>>offset)&0x01;
//	                                                 	}
//	                                                 	else if(gpcan_para->type==AC)
//	                                                 	{
//	                                                 		tabid=AC_IND_CONNECT_SWITCH_OFFSET/8+1;
//	                                                 		offset=AC_IND_CONNECT_SWITCH_OFFSET%8;
//
//	                                                 		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32[tabid]>>offset)&0x01;
//	                                                 	}
//
//	if(gpcan_para->data2main->errcode[gunid] >0){//心跳故障
//		can_pro_debug("功率调节失败:CAN通信故障! type=%d value=%d gunid=%d",type,value,gunid);
//		return 1;
//	}
//	else if(conn_state == 1){//车辆未连接
//		can_pro_debug("功率调节失败:车辆未连接! type=%d value=%d gunid=%d",type,value,gunid);
//		return 2;
//	}
//	else if(type!=1 && type!=2 && type!=3 && type!=4){//调节类型不支持
//		can_pro_debug("功率调节失败:调节类型不支持! type=%d value=%d  gunid=%d",type,value,gunid);
//		return 4;
//	}
//	else if((type == 1 && (value>10000 || value<(-10000))) || (type == 2 &&
//			(value>100 || value<0))){//调节值超出范围
//		can_pro_debug("功率调节失败:调节值超出范围! type=%d value=%d  gunid=%d",type,value,gunid);
//		return 3;
//	}
//	else if((type==3 || type==4) && (g_can[gunid].state != WAIT_CHARGEING2)){
//		can_pro_debug("功率调节失败:车辆未充电! type=%d value=%d   gunid=%d",type,value,gunid);
//		return 2;
//	}
//
//	g_can[gunid].ctrltype=type;
//	if(value>10000)
//		value=10000;
//	else if(value<-10000)
//		value=-10000;
//	g_can[gunid].ctrlvalue=value;
//	if(type == 1)
//		g_can[gunid].ctrlvalue += 10000;//偏移量
//	else if(type == 3 || type == 4){
//		g_can[gunid].ctrlvalue = 0;
//	}
//
//	g_can[gunid].state_ctrl=CTRL_PW_EN;
//	g_can[gunid].ms_fk_send=0;
//	g_can[gunid].ms_fk_recv=0;
//	adjust_pw(gunid);
////	g_re_num_fk[gunid]=0;
//	return 0;
//
//}


int orderFormOther(u8 gunid,u8 type,int value,int time,BackResult pfun)//由外部模块调用的函数,BackResult pfun
{

	int ret=0;
	static ctrlpw_bak xx;
	printf("111由外部模块调用的函数,type=%d\n",type);
	sprintf(_tmp_print_str,"收到功率调节指令  gunid=%d  type=%d  value=%d  \n",gunid,type,value);
	gpcan_para->writelog(_tmp_print_str);

	if(type<100)
	{
		if(pfun!=NULL)
		{
			printf("111设置返回回调函数！！！！！！！！！！！myorder\n");
	       myorder=pfun;
		}
		else
			printf("err err err !!!!!!!!!!!!!\n");
		printf("由外部模块调用的函数 功率调节\n");
		ret=can_adjust_charge_pw( gunid, type,value,time);
		if(ret!=0)
		{
			xx.result=1;
			xx.ctrlvalue=ret;

			printf("111由外部模块调用的函数 功率调节失败\n");
	//		pfun(gunid,(void*)&xx);
		}
//		else
//			myorder=NULL;



	}
	else if(type==100)//解锁
	{
		printf("由外部模块调用的函数 解锁");
		off_gunLock(gunid,2);

	}
	return 0;
}
//static int can_adjust_charge_pw(u8 gunid,u8 type,int value, int time)
//{
//	u8 tabid;
//	u8 offset;
//	u8 conn_state;
//
//	if(gpcan_para->type==DC)
//	{
//		tabid=DC_IND_CONNECT_CAR_OFFSET/8+1;
//		offset=DC_IND_CONNECT_CAR_OFFSET%8;
//		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_dc_pf22[tabid]>>offset)&0x01;
//	}
//	else if(gpcan_para->type==AC)
//	{
//		tabid=AC_IND_CONNECT_SWITCH_OFFSET/8+1;
//		offset=AC_IND_CONNECT_SWITCH_OFFSET%8;
//
//		conn_state=(gpcan_para->data2main->gun[gunid].yx_data.yx_ac_pf32[tabid]>>offset)&0x01;
//	}
//
//	if(gpcan_para->data2main->errcode[gunid] >0){//心跳故障
//		can_pro_debug1("功率调节失败:CAN通信故障! type=%d value=%d gunid=%d",type,value,gunid);
//	return 1;
//	}
//	else if(conn_state == 1){//车辆未连接
//		can_pro_debug("功率调节失败:车辆未连接! type=%d value=%d gunid=%d",type,value,gunid);
//	return 2;
//	}
//	else if(type!=1 && type!=2 && type!=3 && type!=4){//调节类型不支持
//		can_pro_debug("功率调节失败:调节类型不支持! type=%d value=%d  gunid=%d",type,value,gunid);
//	return 4;
//	}
//	else if((type == 1 && (value>10000 || value<(-10000))) || (type == 2 &&
//			(value>100 || value<0))){//调节值超出范围
//		can_pro_debug("功率调节失败:调节值超出范围! type=%d value=%d  gunid=%d",type,value,gunid);
//			return 3;
//	}
//	else if((type==3 || type==4) && (g_can[gunid].state != WAIT_CHARGEING2)){
//		can_pro_debug("功率调节失败:车辆未充电! type=%d value=%d   gunid=%d",type,value,gunid);
//		return 2;
//	}
//
//	g_can[gunid].ctrltype=type;
//	if(value>10000)
//		value=10000;
//	else if(value<-10000)
//		value=-10000;
//	g_can[gunid].ctrlvalue=value;
//	if(type == 1)
//		g_can[gunid].ctrlvalue += 10000;//偏移量
//	else if(type == 3 || type == 4){
//		g_can[gunid].ctrlvalue = 0;
//	}
//
//	if(type == 3)
//		g_can[gunid].ctrtime = time;
//
//	g_can[gunid].state_ctrl=CTRL_PW_EN;
//	g_can[gunid].ms_fk_send=0;
//	g_can[gunid].ms_fk_recv=0;
//	adjust_pw(gunid);
//	//	g_re_num_fk[gunid]=0;
//	return 0;
//
//}




